Interbase/Firebird - chybny typ fieldu
Otázka od: jsdelphi@creatix.cz
17. 11. 2004 16:35
Mam ve firebirdu 1.5 definovany pohled:
create view test as
select jmeno, prijmeni, pocet, round(pocet/5000,1) as xx from ciselnik;
(Field "pocet" je typu integer.)
Kdyz nacitam data do DBGridu pres TIBQuery(select * from test) a
nenadefinuji seznam fieldu, vytvori se v runtime seznam fieldu automaticky
(to je normalni). Problem je v tom, ze field "xx" z uvedeneho pohledu se
nadefinuje jako typ integer a nikoliv float. V pripade
"round((pocet+0.1)/5000,1) as xx" je vse v poradku a vytvori se field typu
float.
Ocekavany vysledek v DBGridu:
Petr Novak 5000 1
Jan Kun 2000 0.4
Skutecny vysledek v DBGridu (xx = round(pocet/5000,1)):
Petr Novak 5000 1
Jan Kun 2000 0
Skutecny vysledek v DBGridu (xx = round((pocet+0.1)/5000,1)):
Petr Novak 5000 1
Jan Kun 2000 0.4
Nevite nekdo co s tim? Neni problem v tom, ze na 1.radku dat je "pocet" =
5000, takze vysledek je celociselny = 1? Nechce se mi pro kazdy TIBQuery
definovat seznam fieldu, kdyz mam aplikaci v neustalem vyvoji.
Dekuji
Jan Skopovy
Odpovedá: Slavomir Skopalik
17. 11. 2004 17:45
pouzij round(CAST(poce AS FLOAT)t/5000,1),
nebo round(pocet+0.0/5000,1)
Slavek
> create view test as
> select jmeno, prijmeni, pocet, round(pocet/5000,1) as xx
> from ciselnik;
>
> (Field "pocet" je typu integer.)
Odpovedá: petr palicka
18. 11. 2004 6:58
Slavomir Skopalik wrote:
> pouzij round(CAST(poce AS FLOAT)t/5000,1),
> nebo round(pocet+0.0/5000,1)
^^^^^^^^^^^^^^
to asi ne, to by nejprve delil a potom scital.
bud 0.0+... nebo 1.0*... nebo ten cast.
peca
Odpovedá: Jan Novak
20. 11. 2004 13:36
> SELECT jmeno, prijmeni, pocet, round(pocet/5000,1) AS xx FROM
ciselnik;
> field "xx" se nadefinuje jako typ integer a nikoliv float.
Kdybys to psal v Pascalu, bylo by ti to jasne hned: vysledek je
integer, kdyz misto '/' das 'div'. V prostredi, kde pro oba pripady je
'/', musis typ vysledku urcit explicitne, staci napriklad
pocet / 5000.0
nebo explicitne pretypovat ten 'pocet' volanim vhodne funkce.